package model

import daos.MapaMundi
import daos.VillanoDAO
import java.util.List
import java.util.Random

class Partida {
	
	@Property MapaMundi mapamundi= new MapaMundi()
	
	@Property VillanoDAO bddVillano= new VillanoDAO()
	
	
	@Property var Ruta recorridoDelVillano
	
	@Property Villano villanoCulpable
	
	@Property Detective detective = new Detective()
						
	@Property  boolean datosCreados = false
	
	@Property List<String> destinosFallidos = newArrayList
	
	
	
	def agregarVillano(Villano villano){ 
		bddVillano.agregar(villano)
	}
	
	def quitarVillano(Villano villano){
		bddVillano.quitar(villano)
	}
	
	
	def agregarPais(Pais pais){
		mapamundi.agregar(pais)
	}
	
	def quitarPais(Pais pais){
		mapamundi.quitar(pais)
	}


	def crearCaso(){
		if(!datosCreados){
			this.elegirVillanoAleatorio()
			this.crearRutaDeEscape()
			datosCreados = true
		}
	}


//Metodos Auxiliaress
	private def int randInt(int min, int max) {

    // NOTE: Usually this should be a field rather than a method
    // variable so that it is not re-seeded every call.
    val Random rand = new Random()

    // nextInt is normally exclusive of the top value,
    // so add 1 to make it inclusive
    val int randomNum = rand.nextInt((max - min)) + min

    return randomNum
}
	
	
	private def elegirVillanoAleatorio(){
		if(bddVillano.villanos.size >= 2)
			villanoCulpable = bddVillano.villanos.get(randInt(0, bddVillano.villanos.size))
		else
			throw new RuntimeException("No hay villanos suficientes. (Cantidad necesaria: 5)")
	}
	
	private def crearRutaDeEscape(){
		
		val rutaVillano = newArrayList
		val boolean hayPaisesSuficientes = mapamundi.paises.size >= 3
		var Pais paisAAgregar
		
		if(hayPaisesSuficientes){
			paisAAgregar = mapamundi.paises.get(randInt(0, mapamundi.paises.size))
			rutaVillano.add(paisAAgregar)
			while(rutaVillano.size < 3){
				var Pais siguientePais = paisAAgregar.darConexionPosible()
				rutaVillano.add(siguientePais)
				paisAAgregar = siguientePais				
			}
				this.recorridoDelVillano = new Ruta(rutaVillano, this.villanoCulpable)
		} else {
			throw new RuntimeException("No hay paises suficientes. (Cantidad necesaria: 10)")
		}
	}
	
	def empezarJuego(){
		this.crearCaso
		this.detective.viajarAlSiguientePais(this.recorridoDelVillano.paisActual)
		this.detective.setRuta(this.detective.paisActual.toString)
	}
	
	
	def moverVillanoSiEsNecesario(Pais pais) {
		if(this.recorridoDelVillano.debeMoverse(pais))
			this.recorridoDelVillano.siguientePais
			if(!this.recorridoDelVillano.paisSiguiente.equals(pais)){
				this.destinosFallidos.add(pais.toString)
			}
	}
	
	def atrapeAlCulpable() {
		this.detective.atraparCriminal(villanoCulpable)
	}
	
	def terminoLaPartida(){
		this.recorridoDelVillano.esElUltimoPais()
	}
	
}